import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 我认为 自己不看别人的代码先实现一遍，是为了，更容易看懂，别人的代码
 *
 */
public class LeetCode_InterView_17_07 {


    // 面试题 17.07. 婴儿名字
    /*
    每年，政府都会公布一万个最常见的婴儿名字和它们出现的频率，也就是同名婴儿的数量。有些名字有多种拼法，例如，John 和 Jon 本质上是相同的名字，但被当成了两个名字公布出来。给定两个列表，一个是名字及对应的频率，
    另一个是本质相同的名字对。设计一个算法打印出每个真实名字的实际频率。注意，如果 John 和 Jon 是相同的，并且 Jon 和 Johnny 相同，则 John 与 Johnny 也相同，即它们有传递和对称性。

        在结果列表中，选择字典序最小的名字作为真实名字。

        示例：

        输入：names = ["John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"], synonyms = ["(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"]
        输出：["John(27)","Chris(36)"]
        提示：

        names.length <= 100000

    */
    /*
    字典排序 在我的理解就是直接拿字符去比较
    字典排序如下:
    * '0' < '1' < '2' < ... < '9' < 'a' < 'b' < ... < 'z'
    * */

    public static void main(String[] args) throws Exception {
        String[] names = {"John(15)","Jon(12)","Chris(13)","Kris(4)","Christopher(19)"},
                synonyms = {"(Jon,John)","(John,Johnny)","(Chris,Kris)","(Chris,Christopher)"};

        // 拆名称和频率，左边放 name ,右边放 出现的频率
        HashMap<String, String> namesMap = new HashMap<>();
        for (int i = 0; i < names.length; i++) {
            namesMap.put(getNamesMapKey(names[i]), getFrequency(names[i]));
        }

        // 拆分一对本质相同的名字,String 放入 字段序最小的 name,List 里面放入与 name 本质上是相同的名字（不放 name 本身）
        Map<String, List<String>> synonymsMap = new HashMap<>();
        for (int i = 0; i < synonyms.length; i++) {
            
        }



    }

    //
//    public static Integer

    /**
     * 字典序，a
     * 得到两个字符串中字典序最小的字符串
     * @param value1 字符串1
     * @param value2 字符串2
     * @return 字典序最小的字符串
     */
    private static String getLessDictionaryOrder(String value1,String value2){
//        if(StringUtils.isEmpty(value1) || StringUtils.isEmpty(value2) ){
        String result = "";
        if("".equals(value1) || "".equals(value2) ){
            return ("".equals(value1))?value2:value1;
        }
        char[] chars1 = value1.toCharArray(),chars2 = value2.toCharArray();
        int length = Math.min(value1.length(), value2.length());
        for (int i = 0; i < length; i++) {
            // 字符会比较 ASCII
            if(chars1[i] < chars2[i]){
                result = value1;
                break;
            }else if(chars1[i] > chars2[i]){
                result = value2;
                break;
            }
        }
        // 如果一直相等，即：abc abcd 取length小的那一个
        if("".equals(result) ){
            result = (value1.length() == length) ? value1 : value2;
        }
        return result;
    }

    // 这里需要补上 OrderUtils
    // solution1：
    // 1.拿到不重复的本质相同的name（String 赋值 "1" "2" "3"）
    // 2.给 name 排序 （String 赋值最小字典序)
    // solution 2 :
    // 1.在 "拿到不重复的本质相同的name" 的时候排序



    /**
     *
     * @return
     */
    private static boolean endRecursive(){
        return true;
    }

    /**
     * 获取名字
     * @param name
     * @return
     * @throws Exception
     */
    private static String getNamesMapKey(String name) throws Exception {
        return parseName(name)[0];
    }

    /**
     * 获取使用频率
     * @param name
     * @return
     * @throws Exception
     */
    private static String getFrequency(String name) throws Exception {
        return parseName(name)[1];
    }

    /**
     *
     * @param name John(15)
     * @return String[]  {"John","15"}
     *
     * 拆分思路：
     * 1.把 "(" 替换为 ","
     * 2.然后删除 ")"
     * 3.然后 split(",")
     *
     * case
     * 1."("不是英文括号
     */
    private static String[] parseName(String name) throws Exception {
        if (StringUtils.contains(name, "(")) {
            name = name.replace("(", ",").replace(")", "");
        }
        return name.split(",");
    }

    /**
     * 获取左边的名字
     * @param names
     * @return
     * @throws Exception
     */
    private static String getLeftName(String names) throws Exception {
        return parseSynonym(names)[0];
    }

    /**
     * 获取右边的名字
     * @param names
     * @return
     * @throws Exception
     */
    private static String getRightName(String names) throws Exception {
        return parseSynonym(names)[1];
    }


    /**
     *
     * @param synonym (Jon,John)
     * @return String[]  {"Jon","John"}
     *
     * 拆分思路：
     * 1.删除"("和”)“
     * 2.split(",")
     */
    private static String[] parseSynonym(String synonym) throws Exception {
        if (StringUtils.contains(synonym, "(")) {
            synonym = synonym.replace("(", "").replace(")", "");
        }
        return synonym.split(",");
    }


}
